package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaProd;
import com.sisgesbyte.services.administracion.bean.CategoriaProdBean;
import com.sisgesbyte.services.administracion.bean.CategoriaProdListaResponse;
import com.sisgesbyte.services.proyeccion.ProyeccionCategoriaClienteService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyeccionProductResponse;
import com.sisgesbyte.services.proyeccion.bean.AvanceVentaProductosBean;
import com.sisgesbyte.services.proyeccion.bean.FiltrosProyeccionCanalBean;

@ManagedBean
@ViewScoped
public class ProyeccionCateoriaClienteProdMBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private ProyeccionCategoriaClienteService proyeccionCategoriaClienteService;
	@EJB
	private MantenimientoCategoriaProd mantenimientoCategoriaProd;
	@ManagedProperty(value = "#{proyeccionCategoriaClienteMBean}")
	private ProyeccionCategoriaClienteMBean proyeccionCategoriaClienteMBean;
	private List<CategoriaProdBean> listaCategoriaProductos;
	private List<CategoriaProdBean> listaCategoriaPadres;
	private List<CategoriaProdBean> listaCategoriaHijos;
	private String txtBuscar;
	private int idCategoriaProducto;
	private List<AvanceVentaProductosBean> listaProductos;
	private List<AvanceVentaProductosBean> listaProductosTemporal;
	private List<CategoriaProdBean> categoriaHijos;
	
	
	@PostConstruct
	public void init() {
		txtBuscar = "";
		cargarCategorias();
		inicializar();
		categoriaHijos = new ArrayList<CategoriaProdBean>();
	}

	public void inicializar() {

		try {
			FiltrosProyeccionCanalBean filtros = new FiltrosProyeccionCanalBean();
			filtros.setIdPeriodo(proyeccionCategoriaClienteMBean.getPeriodoDefault());
			filtros.setIdZona(proyeccionCategoriaClienteMBean.getIdZona());
			AvanceProyeccionProductResponse listaProductosZona = proyeccionCategoriaClienteService.listaProductosCanal(ObtenerIdTransaccion(), filtros);
			this.listaProductos = new ArrayList<AvanceVentaProductosBean>();

			if (listaProductosZona.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaProductos = listaProductosZona.getListaProductosZonas();
				//variable temporal para los productos y poder aplicarles filtro
				this.listaProductosTemporal = this.listaProductos;
			} else {
				System.out.println("Error al obtener los productos");
			}

		} catch (Exception e) {
			System.out
					.println("Error al obtener la lista de productos por zona "
							+ e.getMessage());
		}
	}
	public void cargarCategorias() {
		try {

			CategoriaProdListaResponse categorias = mantenimientoCategoriaProd.listaCategoriasProducto(ObtenerIdTransaccion(), null);
			listaCategoriaProductos = new ArrayList<CategoriaProdBean>();
			listaCategoriaPadres = new ArrayList<CategoriaProdBean>();
			listaCategoriaHijos = new ArrayList<CategoriaProdBean>();
			for (CategoriaProdBean ls : categorias.getListaCategoriaProductos()) {
				if (ls.getPadre_id() == 0) {
					listaCategoriaPadres.add(ls);
				} else {
					listaCategoriaHijos.add(ls);
				}
			}

			for (CategoriaProdBean ls : listaCategoriaPadres) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		} catch (Exception e) {
			System.out.println("Error al cargar las categorias: " + e);
		}
	}
	// metodo para obtener la estructura de hijos de una categoria
		public void mostrarHijos(int padreId) {

			for (CategoriaProdBean ls : listaCategoriaHijos) {
				if (padreId == ls.getPadre_id()) {
					listaCategoriaProductos.add(ls);
					mostrarHijos(ls.getId());
				}
			}
		}

		public void obtenerCategoriaHijos(int idPadre) {

			for (CategoriaProdBean ls : listaCategoriaProductos) {
				if (idPadre == ls.getPadre_id()) {
					categoriaHijos.add(ls);
					obtenerCategoriaHijos(ls.getId());
				}
			}
		}

		public String ObtenerIdTransaccion() {
			String sessionId = "";
			try {
				FacesContext fCtx = FacesContext.getCurrentInstance();
				HttpSession session = (HttpSession) fCtx.getExternalContext()
						.getSession(false);
				sessionId = session.getId().replace(".undefined", "");
			} catch (Exception e) {
				sessionId = "Error";
				System.out.println("Error al obtener Session" + e);
			}

			return sessionId;
		}

		public void crearFiltro() {
			categoriaHijos = new ArrayList<CategoriaProdBean>();
			this.listaProductosTemporal = new ArrayList<AvanceVentaProductosBean>();

				// buscamos al padre
				for (CategoriaProdBean ls : listaCategoriaProductos) {
					if (idCategoriaProducto == ls.getId()) {
						categoriaHijos.add(ls);
					}
				}
				// buscamos los hijos
				obtenerCategoriaHijos(idCategoriaProducto);

				// recorremos las categorias
				for (CategoriaProdBean cat : categoriaHijos) {
					// buscamos los productos por categoria
					for (AvanceVentaProductosBean prod : listaProductos) {
						if (prod.getCategoriaProductoId() == cat.getId() && (prod.getMarca()+ " / " + prod.getProducto() + " / " + prod.getCodProd()).toLowerCase().contains(txtBuscar.toLowerCase().trim())) {
							this.listaProductosTemporal.add(prod);
						}
					}
				}
		}

	public ProyeccionCategoriaClienteMBean getProyeccionCategoriaClienteMBean() {
		return proyeccionCategoriaClienteMBean;
	}

	public void setProyeccionCategoriaClienteMBean(
			ProyeccionCategoriaClienteMBean proyeccionCategoriaClienteMBean) {
		this.proyeccionCategoriaClienteMBean = proyeccionCategoriaClienteMBean;
	}

	public List<CategoriaProdBean> getListaCategoriaProductos() {
		return listaCategoriaProductos;
	}

	public void setListaCategoriaProductos(
			List<CategoriaProdBean> listaCategoriaProductos) {
		this.listaCategoriaProductos = listaCategoriaProductos;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public int getIdCategoriaProducto() {
		return idCategoriaProducto;
	}

	public void setIdCategoriaProducto(int idCategoriaProducto) {
		this.idCategoriaProducto = idCategoriaProducto;
	}

	public List<AvanceVentaProductosBean> getListaProductos() {
		return listaProductos;
	}

	public void setListaProductos(List<AvanceVentaProductosBean> listaProductos) {
		this.listaProductos = listaProductos;
	}

	public List<AvanceVentaProductosBean> getListaProductosTemporal() {
		return listaProductosTemporal;
	}

	public void setListaProductosTemporal(
			List<AvanceVentaProductosBean> listaProductosTemporal) {
		this.listaProductosTemporal = listaProductosTemporal;
	}
	
	
}
